AWS AppSync でパイプラインリゾルバーを設定してみた

AWS AppSync でパイプラインリゾルバーを設定してみた

Clock Icon2024.11.25

こんにちは、森田です。

AWS AppSync では、GraphQLのリゾルバーを関数として作成することができます。

また、この時の関数については、単一の関数ではなく、複数の関数を組み合わせて、パイプラインリゾルバーとして構成することもできます。

本記事では、JavaScript を使ったパイプラインリゾルバーを設定してみます。

やってみた

APIの作成

AWSマネジメントコンソールで作成を行います。

APIタイプにGraphQL APIs、GraphQL API データソースにDesign from scratchを選択して「次へ」を選択します。

img.png

名前は、sample-apiを入力し、「次へ」を選択します。

img.png

GraphQL タイプは、後で GraphQL リソースを作成を選択し、「次へ」を選択します。

img.png

最後に「APIを作成」を選択します。

img.png

データソースの作成

まずは、データソースの作成を行います。

データソースのページを開き、「データソースを作成」を選択します。

img.png

特に、DynamoDBなどは利用しませんので、「NONE」を選択して作成します。

img.png

スキーマ作成

続いて、スキーマの作成を行います。

今回はサインアップを想定したスキーマを作成します。

schema {
    query: Query
    mutation: Mutation
}

type Mutation {
    signUp(input: Signup): User
}

type Query {
    getUser(id: ID!): User
}

input Signup {
    username: String!
    email: String!
}

type User {
    id: ID!
    username: String
    email: AWSEmail
}

スキーマ入力後、画面上部の「スキーマを保存」を選択します。

img_23.png

リゾルバーの作成

スキーマ作成後、Mutationのリゾルバーを設定します。

img.png

リゾルバータイプはパイプラインリゾルバー、リゾルバーランタイムはAppSync JavaScriptを選択し、「作成」を選択します。

img.png

Mutationのリクエスト/レスポンスの定義

まずは、パイプラインのリクエスト、レスポンスを行う関数を作成します。

export function request(ctx) {
    ctx.stash.email = ctx.args.input.email
    return {};
}

export function response(ctx) {
    return ctx.prev.result;
}

この関数では、入力されたemailをパイプラインで処理しやすいようにctx.stash.emailに代入しています。

validateEmail 関数の作成

続いて、パイプラインで使用する関数を作成します。

以下のように「関数を作成」を選択します。

img.png

今回の処理では、サインアップを想定していますので、事前にメールアドレスのバリデーションを行うvalidateEmail 関数の作成を行います。

データソースには、nonesourceを選択します。

img.png

作成後、関数を追加から「validateEmail」を選択し、追加します。

img.png

追加後、validateEmail関数を編集します。

img.png

以下のコードを入力し、保存を行います。

import { util } from '@aws-appsync/utils';

export function request(ctx) {
  const { email } = ctx.stash;
  const valid = util.matches(
    '^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com',
    email
  );
  if (!valid) {
    util.error(`"${email}" is not a valid email.`);
  }

  return { payload: { email } };
}

export function response(ctx) {
  return ctx.result;
}

saveUser 関数の作成

新規に関数の追加を行い、同様にsaveUser 関数を作成します。

img.png

以下のコードを入力し、保存を行います。

import { util } from '@aws-appsync/utils';

export function request(ctx) {
  return ctx.prev.result;
}

export function response(ctx) {
  ctx.result.id = util.autoId();
  return ctx.result;
}

なお、上記のコードでは、ユーザの作成は実際に行ってはおらず、IDのみを生成する処理となっています。

最終的に以下のように関数を定義しています。

img.png

このパイプラインでは、以下の順で処理が実行されます。

  • Mutation リクエストハンドラ
  • validateEmail 関数
  • saveUser 関数
  • Mutation レスポンスハンドラ

クエリの実行

では、実際にクエリを実行して期待した動作を行うか確認してみます。

mutation MyMutation {
  signUp(input: {email: "[email protected]", username: "nadia"}) {
    username
    id
  }
}

img.png

{
  "data": {
    "signUp": {
      "username": "nadia",
      "id": "0656e83f-b844-4aa8-a6d1-94711905861a"
    }
  }
}

ユーザ情報が問題なく返却されました。

今度は、バリデーションエラーとなるように[email protected]を入力します。

mutation MyMutation {
  signUp(input: {email: "[email protected]", username: "nadia"}) {
    username
    id
  }
}

すると、期待した通りエラーを返してくれました。

{
  "data": {
    "signUp": null
  },
  "errors": [
    {
      "path": [
        "signUp"
      ],
      "data": null,
      "errorType": null,
      "errorInfo": null,
      "locations": [
        {
          "line": 2,
          "column": 3,
          "sourceName": null
        }
      ],
      "message": "\"[email protected]\" is not a valid email."
    }
  ]
}

さいごに

今回はコンソール上から作成してみましたが、今度はCDKなどで作成してみたいと思います。

また、データソースを使用しませんでしたが、DynamoDBをはじめ様々なソースがあるのでそれもどこかの機会に試してみます。

https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers-js.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.